/*
 * @版权所有(C): 1999-2021,西安交大捷普网络科技有限公司
 * @FilePath: \client\baselib\LibCommonUtils\StringUtils.h
 * @作者: 岳保保
 * @Date: 2023-01-04 16:30:12
 * @功能描述: string 字符串处理工具类
 */
#ifndef STRING_UTILS_H
#define STRING_UTILS_H
#include <string>
#include <cstring>
#include <vector>
#include <sstream>

namespace StringUtils
{
/**
     * @功能描述: 获取字符串中间文件
     * @param {string} &srcString 分割源字符串 分割头 分割尾
     * @param {char *} div 分割头 分割尾
     * @返回值: 分割结果
     */
    const std::string getStringInMid(const std::string &src, const std::string &head, const std::string &tile);

    /**
     * @功能描述: 字符串分割方法
     * @param {string} &srcString 分割源字符串
     * @param {char *} div 分割字符串
     * @返回值: 分割结果
     */
    const std::vector<std::string> stringSpilt(const std::string& srcString, const std::string& div);

    /**
     * @brief 字符串替换
     * @param str 源串
     * @param from 待替换串
     * @param to 替换串
     * @return
     */
    std::string& replace(std::string& str, const std::string& from, const std::string& to);

    /**
     * @brief 删除字符串中所有的给定字符
     * @param str 源串
     * @return 删除字符个数
     */
    int remove(std::string& str, std::string::value_type ch);

    /**
     * @功能描述: 删除字符串前面的所有空格
     * @入参参数: 待删除空格的字符串
     * @返回值: 删除空格之后的字符串
     */
    std::string removeFrontSpace(std::string str);

    /**
     * @功能描述: 删除字符串前后的所有特殊字符
     * @入参参数: 待删除特殊字符的字符串
     * @返回值: 
     */
    void removeSpecialChar(std::string& str);

    /**
     * @功能描述: 源字符串是否是以目标字符串前缀开始的
     * @入参参数: 源字符串 目标字符串
     * @返回值: true 以目标字符串前缀开始的 false 不是以目标字符串前缀开始的
     */
    bool isSrcStringStartWith(const std::string& srcStr, const std::string& targetStr);

    /**
       @brief 去除字符串的前后空格
       @param string str :待操作字符串
       @return 去除前后空格之后的字符串
    */
    std::string trim(std::string& str, const std::string& pattern = " ");

    /**
     * @功能描述: 处理mac地址格式，由58 69 6C 1C 09 26 改为58:69:6C:1C:09:26
     * @入参参数: macStr:原始格式mac地址
     *           pattern:分割字符串
     * @返回值: true 以目标字符串前缀开始的 false 不是以目标字符串前缀开始的
     */
    std::string trimMac(std::string macStr, std::string pattern);

    /**
     * @功能描述: 不区分大小写匹配
     * @入参参数: 匹配源字符串，匹配子字符串
     * @返回值: 是否匹配成功
     */
    bool matchStringNoCaseSensitive(const std::string& tagStr, const std::string& childStr);

    /**
     * @功能描述: 格式化字符串
     * @入参参数: 可变长字符串
     * @返回值: string
     */
    const std::string formString(const char* format, ...);

    /*********************************
    @函数描述: 将string 转为基础类型
    @入参 : string
    @返回值 :基础类型
    **********************************/
    template <typename T>
    T string2Pod(const std::string& str)
    {
        std::istringstream iss(str);
        T number;
        iss >> number;
        return number;
    }

    /*********************************
    @函数描述: 将string 转为基础类型 模板特化
    @入参 : string
    @返回值 :基础类型
    **********************************/
    template <>
    inline std::string string2Pod<std::string>(const std::string& str)
    {
        return str;
    }

    /*********************************
    @函数描述: 将string 转为基础类型 模板特化
    @入参 : string
    @返回值 :基础类型
    **********************************/
    template <>
    inline bool string2Pod<bool>(const std::string& str)
    {
        if (str == "false" || str == "0" || str.empty())
        {
            return false;
        }
        return true;
    }

    /*********************************
    @函数描述: 将基础类型 转为string
    @入参 : 基础类型
    @返回值 :string
    **********************************/
    template <typename T>
    const std::string pod2String(T data)
    {
        std::stringstream streamStr;
        streamStr << data;
        return streamStr.str();
    }

    /*********************************
    @函数描述: 将基础类型 转为string 模板特化
    @入参 : string
    @返回值 :基础类型
    **********************************/
    template <>
    inline const std::string pod2String<std::string>(std::string data)
    {
        return data;
    }

    /*********************************
    @函数描述: 将基础类型 转为string 模板特化
    @入参 : string
    @返回值 :基础类型
    **********************************/
    template <>
    inline const std::string pod2String<bool>(bool data)
    {
        if (data)
        {
            return "true";
        }
        return "false";
    }
};
#endif
